#include <assert.h>
#include <stdarg.h>
#include <type.h>
#include <stdio.h>

static u8 buf[1024];

// 强制阻塞
#define SPIN(name) \
    printk("Error in func: %s\n", (name)); \
    while (true)

void AssertionFailure(char *exp, char *file, char *base, int line)
{
    printk("assert(%s) failed!\n"
        "    file: %s \n"
        "    base: %s \n"
        "    line: %d \n",
        exp, file, base, line);

        SPIN(__func__);

    // 不可能走到这里，否则出错；
    asm volatile("ud2"); // 嵌入汇编代码
}

void Panic(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    int i = vsprintf(buf, fmt, args);
    va_end(args);

    printk("panic by: %s \n", buf);
    SPIN(__func__);

    // 不可能走到这里，否则出错；
    asm volatile("ud2");
}
